﻿using System;
using System.Windows.Forms;
using LayerEntity.Persona;
using LayerEntity.Persona.Proveedores ;
using LayerEntity.Sistema;
using LayerLogic;

namespace System2012.Persona.Proveedores
{
    public partial class MantenimientoProveedores : DevExpress.XtraEditors.XtraForm 
    {
        #region Variables
        /// <summary>
        /// Especifica el estado acutal del registro.
        /// Valores: 
        /// 1: Nuevo proveedor
        /// 2: Editando proveedor
        /// </summary>
        int intEditingProveedor = 0;
        #endregion
        public MantenimientoProveedores()
        {
            this.InitializeComponent();
            SystemUtils.RecordManagerPersona.UpdateList += new LayerLogic.Persona.LPersona.AddObject(UpdateGrilla);
            this.NuevoProveedor();
        }

        #region Metodos

        private void NuevoProveedor()
        {
            this.TxtCodigo.EditValue = "0";
            this.TxtNumero.EditValue = string.Empty;
            this.txtRSocial.EditValue = string.Empty;
            this.TxtNComercial.EditValue = string.Empty;
            
            this.TxtObservacion.EditValue = string.Empty;
            this.intEditingProveedor = 1;
            this.ucDireccion1.NewAddress();
        }

        private void UpdateGrilla(string msj, LayerLogic.EnumOperaciones op)
        {
            this.RefreshLista();
        }

        void RefreshLista()
        {
            this.gridControl1.DataSource = SystemUtils.RecordManagerPersona.GetProveedores();
            this.gridControl1.RefreshDataSource();
        }

        private void SaveProveedor()
        {
            bool ejecutar = true;
            if (this.CbTipo.EditValue == null)
            {
                ejecutar = false;
                SystemUtils.AlerMessaje ("Seleccione un Tipo de Proveedor");
                this.CbTipo.Focus();
                return;
            }
            if (this.CbDocumento.EditValue == null)
            {
                ejecutar = false;
                SystemUtils.AlerMessaje("Seleccione un Tipo de Documento");
                this.CbDocumento.Focus();
                return;
            }

            if (this.TxtNumero.EditValue.ToString().Trim() == string.Empty)
            {
                ejecutar = false;
                SystemUtils.AlerMessaje("Ingrese el Numero de Documento" );
                this.TxtNumero.Focus();
                return;
            }

            if (this.txtRSocial.EditValue.ToString().Trim() == string.Empty)
            {
                ejecutar = false;
                SystemUtils.AlerMessaje("Ingrese la Razon Social del Proveedor" );
                this.txtRSocial.Focus();
                return;
            }
            EDireccion dir = this.ucDireccion1.GetDireccion();

            if (dir == null)
            {
                ejecutar = false;
                return;
            }

            if (ejecutar)
            {
                EnumOperaciones op;
                IEPersona p = ObjectFactoryPersona.CreateSupplier ();
                if (this.intEditingProveedor == 1)
                {
                    op = EnumOperaciones.Insertar;
                    p.IdPersona = "";
                    p.TipoPersonaSistema = "01000000000000";
                }
                else
                {
                    op = EnumOperaciones.Actualizar;
                    p.IdPersona = this.TxtCodigo.EditValue.ToString();
                    p.TipoPersonaSistema = ((IEPersona)this.gridView1.GetFocusedRow()).TipoPersonaSistema;
                }
                p.IdTipoProveedor = (int)this.CbTipo.EditValue;
                p.IdTipoDocumento = (int)this.CbDocumento.EditValue;
                p.NumeroDocumento = this.TxtNumero.EditValue.ToString();
                p.RazonSocial = this.txtRSocial.EditValue.ToString();
                p.NombreComercial = this.TxtNComercial.EditValue.ToString();
                p.Observacion = this.TxtObservacion.EditValue.ToString();
                string id = SystemUtils.RecordManagerPersona.SaveProveedores(p, op);
                if (id != null)
                {
                    id = id.Trim();
                    p.IdPersona = id;
                    IEPersona newP = null;

                    if (op == EnumOperaciones.Actualizar)
                    {
                        newP = SystemUtils.RecordManagerPersona.GetSupplier(p);
                    }
                    else
                    {
                        newP = p;
                    }
                    if (newP != null)
                    { 
                        dir.IdPersona = id;
                        dir.IsPrincipal = true;
                        int res = SystemUtils.RecordManagerPersona.SaveAddress(dir, this.ucDireccion1.Operacion);
                        if (res > 0)
                        {
                            newP.AddAddressInfo(dir);
                            SystemUtils.InformationMessaje ("Proveedor Registrado");  
                        }
                        else
                        {
                            SystemUtils.AlerMessaje("Proveedor Registrado, pero la Direccion Principal fallo.");  
                        }
                        SystemUtils.RecordManagerPersona.AddProveedor(newP);
                        this.NuevoProveedor();
                    }
                }
            }
        }
        void VerContactos()
        {
            if (gridView1.RowCount > 0)
            {
                IEPersona per = (IEPersona)gridView1.GetFocusedRow();
                if (per != null)
                {
                    MantenimientoContactos mc = new MantenimientoContactos(per);
                    mc.ShowDialog();
                    SystemUtils.RecordManagerPersona.AddProveedor (per);
                }
            }
            else
            {
                SystemUtils.AlerMessaje("No hay Informacion de Proveedores");
            }
        }
        private void ViewAcountInfo()
        {
            if (this.gridView1.RowCount > 0)
            {
                IEPersona p = (IEPersona)this.gridView1.GetFocusedRow();
                if (p != null)
                {
                    MantenimientoCuentasBancarias mb = new MantenimientoCuentasBancarias(p);
                    mb.ShowDialog();
                    SystemUtils.RecordManagerPersona.AddProveedor(p);
                }
            }
            else {
                SystemUtils.AlerMessaje("No hay Registro de Proveedores");
            }
        }

        void ViewAddress()
        {
            if (this.gridView1.RowCount > 0)
            {
                IEPersona per = (IEPersona)this.gridView1.GetFocusedRow();
                if (per != null)
                {
                    MantenimientoDireccion md = new MantenimientoDireccion(per);
                    md.ShowDialog();
                }
            }
            else {
                SystemUtils.AlerMessaje("No hay Registro de Proveedores");
            }
        }

        void Editar(IEPersona prov ) {
            if (prov != null)
            {
                this.TxtCodigo.EditValue = prov.IdPersona;
                this.CbDocumento.EditValue = prov.IdTipoDocumento;
                this.CbTipo.EditValue = prov.IdTipoProveedor;
                this.TxtNumero.EditValue = prov.NumeroDocumento;
                this.TxtNComercial.EditValue = prov.NombreComercial;
                this.txtRSocial.EditValue = prov.RazonSocial;
                this.TxtObservacion.EditValue = prov.Observacion;
                this.ucDireccion1.SetDireccion(prov.GetPrincipalAddress());
                this.intEditingProveedor = 2;
            }
        }

        #endregion

        private void ItemClickViewForm(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            this.SaveProveedor();
        }

        private void CombinarRibbon(object sender, DevExpress.XtraBars.Ribbon.RibbonMergeEventArgs e)
        {
            e.MergedChild.BringToFront();
        }

        #region Procesos BackGround
        /// <summary>
        /// Indica que lista es la que se esta cargando actualmente
        /// Valores: 
        /// 1.- Tipo de Clientes
        /// 2.- Documentos 
        /// 3.- Sexo
        /// </summary>
        int intListaCargar = 0;
        private void BgwLoadListDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            //Recupera los tipos de clientes
            if (this.intListaCargar == 1)
            {
                this.BGWLoadList.ReportProgress(30, "Load Tipos de Proveedores");
                e.Result = SystemUtils.RecordManagerCommonList.GetTipoProveedores();
                this.BGWLoadList.ReportProgress(100, "Load Complete");
            }

            //cargamos los documentos
            if (this.intListaCargar == 2)
            {
                this.BGWLoadList.ReportProgress(30, "Load Documentos");
                e.Result = SystemUtils.RecordManagerCommonList.GetDocument(0);
                this.BGWLoadList.ReportProgress(100, "Load Complete");
            }
        }

        private void BgwLoadListProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            //this.lblStatus.Caption = e.UserState.ToString();
        }

        private void BgwLoadListRunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            if (this.intListaCargar == 2)
            {
                this.CbDocumento.Properties.DataSource = e.Result;
            }
            if (this.intListaCargar == 1)
            {
                this.CbTipo.Properties.DataSource = e.Result;
                this.intListaCargar = 2;
                this.BGWLoadList.RunWorkerAsync();
            }
        }

        /// <summary>
        /// Indica si se carga todos los datos de los clientes
        /// </summary>
        int loadAll = 0;
        private void BgwLoadClientesDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            this.BGWLoadProveedores.ReportProgress(30, "Load Proveedores");
            if (this.loadAll == 0)
            {
                SystemUtils.RecordManagerPersona.GetProveedores(100);
            }
            else
            {
                SystemUtils.RecordManagerPersona.GetProveedores(0);
            }
            this.BGWLoadProveedores.ReportProgress(100, "Load Complete");
        }

        private void BgwLoadClientesRunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            //gridControl1.DataSource = SystemUtils.RecordManagerPersona.GetProveedores();
            this.RefreshLista();
            if (loadAll != 0)
            {
                SystemUtils.InformationMessaje("Proceso Completado");
            }
        }

        private void BgwLoadClientesProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            this.barEditItem1.Caption = e.UserState.ToString();
        }

        #endregion

        private void MantenimientoProveedores_Load(object sender, EventArgs e)
        {
            this.Size = new System.Drawing.Size(this.MdiParent.Size.Width, this.MdiParent.Size.Height);
            this.Location = new System.Drawing.Point(this.MdiParent.Location.X, this.MdiParent.Location.Y);
            this.intListaCargar = 1;
            this.BGWLoadList.RunWorkerAsync();
            this.BGWLoadProveedores.RunWorkerAsync();
        }

        private void ItemClickAction(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if ((string) e.Item.Tag == "Nuevo")
            {
                this.NuevoProveedor();
            }

            if ((string)e.Item.Tag == "Guardar")
            {
                this.SaveProveedor();
            }
            if ((string)e.Item.Tag == "LoadAll")
            {
                this.loadAll = 1;
                this.BGWLoadProveedores.RunWorkerAsync();
            }
            if ((string)e.Item.Tag == "Exportar")
            {
                SystemUtils.Exportar("Proveedores", this.gridControl1);
            }

            if (e.Item.Tag.ToString() == "CuentasCtes")
            {
                this.ViewAcountInfo();
            }
            if ((string)e.Item.Tag == "VerDirecciones")
            {
                this.ViewAddress();
            }

            if (e.Item.Tag.ToString().Equals("Contactos")) {
                VerContactos();
            }

            if ((string)e.Item.Tag == "ConvertToClient")
            {
                IEPersona per = ObjectFactoryPersona.ConvertTo((IEPersona)gridView1.GetFocusedRow(), EnumTipoPersona.Cliente );
                if (per != null)
                {
                    if (SystemUtils.RecordManagerPersona.SaveClientes(per, EnumOperaciones.Actualizar) != string.Empty)
                    {
                        SystemUtils.RecordManagerPersona.AddCliente(per);
                    }
                }
            }
            if ((string)e.Item.Tag == "ConvertToEmployee")
            {
                IEPersona per = ObjectFactoryPersona.ConvertTo((IEPersona)gridView1.GetFocusedRow(), EnumTipoPersona.Empleado );
                if (per != null)
                {
                    per.FullName = per.RazonSocial;
                    if (SystemUtils.RecordManagerPersona.SaveEmpleado (per, EnumOperaciones.Actualizar) != "")
                    {
                        SystemUtils.RecordManagerPersona.AddEmpleado (per);
                    }
                }
            }


        }

        private void MantenimientoProveedores_KeyDown(object sender, KeyEventArgs e)
        {
        }

        private void CambiandoIndex(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            Editar((IEPersona)this.gridView1.GetFocusedRow());
        }
        private void CustomsText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.Name == "gcTipoDocumento")
            {
                object obj = this.gridView1.GetRowCellValue(e.RowHandle, this.gcIdTipoDocumento);
                if (obj != null)
                {
                    EDocumento doc = SystemUtils.RecordManagerCommonList.GetDocument(Convert.ToInt64(obj.ToString()));
                    if (doc != null)
                    {
                        e.DisplayText = doc.Abreviatura;
                    }
                }
            }

            if (e.Column.Name == "gcEstado")
            {
                object obj = this.gridView1.GetRowCellValue(e.RowHandle, this.gcIdEstado);
                if (obj != null)
                {
                    EEstado est = SystemUtils.RecordManagerCommonList.GetEstadoById(Convert.ToInt32(obj.ToString()));
                    if (est != null)
                    {
                        e.DisplayText = est.Descripcion;
                    }
                }
            }

            if (e.Column.Name == "gcTipoProveedor")
            {
                object obj = this.gridView1.GetRowCellValue(e.RowHandle, this.gcIdTipoProveedor);
                if (obj != null)
                {
                    ETipoProveedor tp = SystemUtils.RecordManagerCommonList.GetSupplierType(Convert.ToInt32(obj.ToString()));
                    if (tp != null)
                    {
                        e.DisplayText = tp.Descripcion;
                    }
                }
            }
        }

        private void GridView1Click(object sender, EventArgs e)
        {
            Editar((IEPersona)this.gridView1.GetFocusedRow());
        }

        private void PresionandoTeclas(object sender, KeyEventArgs e)
        {
            if (CbDocumento == sender || CbTipo == sender)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                }
                if (e.KeyCode == Keys.Up)
                {
                    SelectNextControl((System.Windows.Forms.Control)sender, false, true, true, true);
                }
            }
            else {
                if (e.KeyCode == Keys.Enter || e.KeyCode ==Keys.Down )
                {
                    System.Windows.Forms.SendKeys.Send("{TAB}");
                }
                if (e.KeyCode == Keys.Up)
                {
                    SelectNextControl((System.Windows.Forms.Control)sender, false, true, true, true);
                }
            }
            
        }

        private void GridView1MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if (gridView1.GetFocusedRow() != null)
                {
                    popupMenu1.ShowPopup(new System.Drawing.Point(MousePosition.X, MousePosition.Y));
                }
            }
        }
    }
}